#-*- coding: utf-8 -*-
import urllib2
try :
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
    

#===============================================================================
# Récupère les data de l'api
#===============================================================================
xmlurl = 'https://api.eve-online.com/corp/AssetList.xml.aspx?keyID=2265134&vCode=7BnDrS2Qd4mECu8aUI5HTnfAPVhUnWjQH1RaUHfoOYOQ9tfofv3VDamWcJQCfbeO'
xmlFile = 'c:/wamp/www/eve_api_test/AssetList_2.xml'

def catchAssetsApi(url):
    #récupère le xml et crée un objet ElementTree xml
    try:
        xml = urllib2.urlopen(url)
        tree = ET.parse(xml)
        root = tree.getroot()
        return root
    except Exception, e:
        print(e)

def catchAssetsApiFile(xmlfile):
    #récupère le xml et crée un objet ElementTree xml
    try:
        tree = ET.parse(xmlfile)
        root = tree.getroot()
        return root
    except Exception, e:
        print(e)

#retourne les top elements (current time, cachedUntil, et le nb d'élément dans la racine)
def printApiMetadata(root):
    print "nb in root: ", len(root)
    print "Current time: ", root[0].text
    print "CachedUntil: ", root[2].text
    #renvoyer une liste avec ces valeurs

#pas usité pour le moment
def print_row(node, parentNode):
    #print "Rows : ", node, type(node)
    if parentNode is not None:
        print "    {0} : {1} - {2}".format(parentNode.get('itemID'), node.get('itemID'), node.attrib)
    else:
        print "{0} : {1}", format( node.get('itemID'), node.attrib)
                
        
#===============================================================================
# Début du parsing du contenu
#===============================================================================
def parse_subrow2(node, tag, parentLv):
    parent_map = dict((c, p) for p in node.getiterator(tag) for c in p)
    return parent_map

# def parse_subrow(node, attribute, attributeValue, subtag, parentLevel):
def parse_subrow(node, tag, parentLevel):
    #variables
    y = 0
    z = parentLevel
    subLevel = []
    subLevel.append(0)
    espace = "    "
    control = True
    subElemList = list()
    parentID = node.get('itemID')
    
#-------------------------------------------------------------------------------     
    #récupère tous les elements fils de node ayant pour tag 'row' (OK) 
    elemList = list(node.getiterator(tag))
    #retire le parent de la liste des noeuds   (ATTENTION SI QUE 1 ELEMENT ????)
    if len(elemList) > 1:
        del elemList[0]
        
    else:
        print "no child: ", len(elemList)
    #return elemList
    print "    Sub - ",len(elemList)," : " 
    
    nbSubItems=0
    for subElement in elemList:
        nbSubItems+=1
        subLevel.append(nbSubItems)
        #espace = espace * len(subLevel)
        print "    ", nbSubItems, subElement.get('itemID'), " - ", len(list(subElement.getiterator(tag)))
        if len(list(subElement.getiterator(tag))) > 1:
            #print "HAS CHILD"
            childs = list(subElement.getiterator(tag))
            del childs[0]
            nbSub=0
            for child in childs:
                nbSub+=1
                subLevel.append(nbSub)
                print "        ",  nbSub ," - ", child.get('itemID')
                parse_subrow(child, 'row', nbSub)                               
        
        elif len(list(subElement.getiterator(tag))) == 1 :
            print "        ", nbSubItems ," : "," - no child"
            
        else:
            print" wrong branch"

# fonction qui parcourt tous les noeuds avec comme tag "sutbag" contenus dans "node" dont les parents sont des noeuds qui ont un attribut "attribute" qui vaut "attributeValue"
def parse_row(node, attribute, attributeValue, subtag):
    y=0
    control= True
    #ça c'est juste! ça prendra que les premiers noeuds!
    #node.iterfind(".//*[@name='assets']/row") => tous les noeud row qui sont enfants de noeuds ayant comme attribut "name" = "assets" => Ok 1 seul niveau donc ça marche
    row = node.iterfind(".//*[@{0}='{1}']/{2}".format(attribute, attributeValue, subtag))
    rowCount = node.findall(".//*[@{0}='{1}']/{2}".format(attribute, attributeValue, subtag))
    print "Nombre de row : ", len(rowCount)
    while control:
        try:
            if row is not None:
                y+=1
                #parcours l'iterateur d'un cran de plus (passe à l'element suivant)
                element = row.next()
                print y, "-", element.get('itemID')
                parse_subrow(element, "row", y) 
                #parentMap = parse_subrow2(element, "row", y)
                #print parentMap
#                 elist = parse_subrow(element, "row", y)
#                 print elist
#                 for subElement in elist:
#                     subList = parse_subrow(subElement, "row", y)
#                     if subList != []:
#                         print
#                     print "    ",subList
                #parse_subrow(element, "name", "contents", "row", y)
        except StopIteration:
            control = False

#===============================================================================
# début du programme - traitement du xml
#===============================================================================
root = catchAssetsApiFile(xmlFile)
parse_row(root, "name", "assets", "row")


#compter le nombre d'asset et sub asset ! => filtre iterfind doit s'arreter au 1er niveau en dessous.


        
          

    
